#include "lrcpage.h"
#include "ui_lrcpage.h"

LrcPage::LrcPage(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::LrcPage)
{
    ui->setupUi(this);


    //设置窗口无标题栏
    setWindowFlag(Qt::FramelessWindowHint);

    //启动动画
    animal = new QPropertyAnimation(this, "geometry", this);
    animal->setDuration(250);
    animal->setStartValue(QRect(10, 10, width(), height()));
    animal->setEndValue(QRect(10, 10 + height(), width(), height()));


    //下拉按钮关联 clicked
    connect(ui->hideBtn, &QPushButton::clicked, this, [=](){
        //this->hide(); //窗口隐藏。
        animal->start();
    });

    //当动画结束之后，窗口需要隐藏起来
    connect(animal, &QPropertyAnimation::finished, this, [=](){
        hide(); //隐藏窗口
    });

    ui->hideBtn->setIcon(QIcon("/image/xiala.png"));

    showLrcWordLine(-1);
}


LrcPage::~LrcPage()
{
    delete ui;
}

//解析lrc文件，吧时间和歌词提取出来放在vector里面
bool LrcPage::parseLrcFile(const QString &path)
{
    //1,打开文件 open
    //QByteArray readLine();
    QFile file(path);
    if(!file.open(QIODevice::ReadOnly))
    {
        qDebug() << "打开lrc文件" << path << "失败";
        return false;
    }

    //将上一首歌曲的lrc歌词清空
    lrcWordLines.clear();


    //一次性读取一行lrc歌词
    while(!file.atEnd())
    {
        QString lineWord = file.readLine(1024);  //QByteArray readLine();

        //解析歌词
        //[0:17.94]xxxxxxxxxxxxxxxx
        //[0:33.600.00]xxxxxxxxxxxxxx
        //1,先解析出时间和歌词的字符串文本  --->按照 ] 进行分割
        int start = 0, end = 0;
        end = lineWord.indexOf(']', start);
        QString lrcTime =  lineWord.mid(start, end - start + 1); //字符串截取
        QString lrcWord = lineWord.mid(end + 1, lineWord.size() - end - 1 - 1 - 1);

        //2,在时间中解析出分:秒.毫秒
        //[0:17.94] [0:33.600.00]
        //截取分
        qint64 lineTime = 0;
        start = 1;
        end = lrcTime.indexOf(':', start);
        lineTime += lrcTime.mid(start, end - start).toInt() * 60 * 1000;

        //解析秒
        start = end + 1;
        end = lrcTime.indexOf('.', start);
        lineTime += lrcTime.mid(start, end - start).toInt() * 1000;

        //解析毫秒
        start = end + 1;
        end = lrcTime.indexOf('.', start);
        lineTime += lrcTime.mid(start, end - start).toInt(); //解析毫秒，刚刚多乘以了一个1000

        //3,将该行的歌词给保存起来
        lrcWordLines.push_back(LrcWorldLine(lineTime, lrcWord));
        //qDebug() << lrcWordLines.size();
    }

//    for(auto e : lrcWordLines)
//    {
//        qDebug() << e._time << e._text;
//    }

    return true;
}


//根据当前的播放时间获得对应在vector里面的播放索引
void LrcPage::showLrcWordLine(qint64 time)
{
    //qDebug() << "time" <<  time;
    //根据当前所唱歌曲的时间来获取当前所唱歌曲在QVector中的索引
    int index = getLrcWordLineIndex(time);
    qDebug() << index;
    //更新当前行，前三行，后三行
    if(-1 == index)
    {
        ui->label_1->setText("");
        ui->label_2->setText("");
        ui->label_3->setText("");
        ui->label_4->setText("当前歌曲暂无歌词");
        ui->label_5->setText("");
        ui->label_6->setText("");
        ui->label_7->setText("");
    }
    else
    {
        ui->label_1->setText(getLrcWordByIndex(index - 3));
        ui->label_2->setText(getLrcWordByIndex(index - 2));
        ui->label_3->setText(getLrcWordByIndex(index - 1));
        ui->label_4->setText(getLrcWordByIndex(index));
        ui->label_5->setText(getLrcWordByIndex(index  +1 ));
        ui->label_6->setText(getLrcWordByIndex(index + 2));
        ui->label_7->setText(getLrcWordByIndex(index + 3));
    }
}

int LrcPage::getLrcWordLineIndex(qint64 time)
{
   // qDebug() << "getLrcWordLineIndex";
    //qDebug() << lrcWordLines[0]._time;
    //将time和QVector中保存的LrcWordLine中的time进行对比
    //当前歌曲没有lrc歌词文件
    if(lrcWordLines.isEmpty())
    {
        qDebug() << "11111111111111111111";
        return -1;
    }

    if(time <= lrcWordLines[0]._time)
    {
//        qDebug() << time;
//        qDebug() << lrcWordLines[0]._time;
        qDebug() << "222222222222222222";
        return 0;
    }

    for(int i = 1; i < lrcWordLines.size(); i++)
    {
        if(time >= lrcWordLines[i - 1]._time && time < lrcWordLines[i]._time)
        {
             qDebug() << "33333333333333333";
            //第i - 1行没有播放完
            return i - 1;
        }
    }

    //最后一行唱完了，歌曲结束了，但是还是有收尾的音乐，所以显示最后一行歌词
    return lrcWordLines.size() - 1;
}


QString LrcPage::getLrcWordByIndex(int index)
{
   if(index < 0 || index >= lrcWordLines.size())
   {
       return "";
   }

   return lrcWordLines[index]._text;
}










